package com.briup.day10;

import java.io.Serializable;

// 接口的定义，使用interface关键字进行修饰和指定
// 接口是对于某一类行为的抽象，类是对于某一类事物的特征和行为的抽象
interface Flyable {
    // 通常在接口中定义抽象方法，其中public abstract关键字可以省略不写
    public abstract void fly();

    // 在接口中是没有构造器方法，在语法层面上就决定了接口是不能创建对象的
    // 接口除了可以定义抽象方法外，还可以定义default关键字修饰的默认方法（jdk8），
    // 还可以定义static修饰的静态方法，以及被private修饰的私有方法（jdk9）
    default void test() {
        // 通常情况下在该方法编写一些对于抽象方法的默认操作
        System.out.println("default修饰的方法，能够被接口的实现类继承并使用");
    }

    private void test2() {
        System.out.println("私有方法在jdk9之后可以定义，可以将接口中一些重要的，" +
                "并且不需要被外界调用的代码逻辑封装到私有方法中");
    }

    // 在接口中话可以定义静态资源 --> static和final修饰的常量、static修饰的方法
    // static修饰的静态方法可以直接被接口调用，而无需创建对象
    // 注意，接口中的静态方法只能是public修饰（一直都是）和private修饰（jdk9）
    public static void mian() {
        System.out.println("");
    }
}

// 鸟是动物，所以要先继承Animal类
// 类可以通过implements关键字指定实现哪些接口，
// 当这个类使用implements关键字实现了接口后，
// 就表示该类具有了在接口中定义的行为/功能
// 只需要该类实现在接口中定义的抽象方法，就相当于得到了一个认证，具有了该行为
class Bird extends Animal implements Flyable {
    @Override
    public void eat() {
        System.out.println("小鸟喜欢吃虫子");
    }

    public void fly() {
        System.out.println("鸟类会飞");
    }
}

// 接口是对于Java类继承的补充，因为Java是单继承，但是它可以是多实现的；
// 也就是说Java类可以同时实现多个接口
class Plane implements Flyable {
    public void fly() {
        System.out.println("飞机以时速700km/h的速度进行飞行作业");
    }
}

class Bat extends Animal implements Flyable {
    @Override
    public void eat() {
        System.out.println("蝙蝠夜间出来觅食");
    }

    public void fly() {
        System.out.println("蝙蝠可以在低空飞行");
    }
}

class Test02 {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.test();
        enroll(bird);
        enroll(new Plane());
        enroll(new Bat());
    }

    // 要举行地球飞行大赛，让所有会飞的物体都来参赛
    // 接口也是对于多态的一种补充，因为接口的引用也可以接收其实现类的对象
    public static void enroll(Flyable a) {
        a.fly();
    }
}
